﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using PalcoCentral.Library;

namespace PalcoCentral
{
    public partial class pcVerPessoa : Form
    {
        private int userType = 0;
        private Database.person person;
        public pcVerPessoa(Database.person person)
        {
            InitializeComponent();
            this.person = person;
            bannerLabel.Text = person.personId+". "+person.personName+"\nGestor Principal > Ver Pessoa";
        }

        private void pcVerPessoa_Load(object sender, EventArgs e)
        {
            if (person.personRole.CompareTo("Teacher") == 0)
            {
                gerirPagBut.Enabled = false;
            }
            insertData();
        }

        private void setUserType(int num)
        {
            userType = num;
        }

        private int getUserType()
        {
            return userType;
        }


        private void insertData()
        {
            if (person.personRole.CompareTo(Library.PersonRole.Student.ToString()) == 0)
            {

                insertGeneralPersonData();
                Library.OperationStatus os = Database.PersonDBAdapter.getInstance().personToStudent(person);
                //Se sim é mesmo estudante
                if (os.sucess)
                {
                    Database.student stu = (Database.student)os.res;
                    typeLabel.Text = "Aluno";
                    setUserType(1);
                    //monthPayVerP.Text = Convert.ToString(stu.monthlyPayment);
                    nameEEVerP.Text = stu.educationResp;
                    telmEEVerP.Text = stu.educationRespMobile;
                    emailEEVerP.Text = stu.educationRespEmail;
                }
                //Se não algo de estranho acontece
            }
            else
            {
                //Mostra professor
                insertGeneralPersonData();
                setUserType(2);
                typeLabel.Text = "Professor";
            }
        }

        private void insertGeneralPersonData()
        {
            if (person.personStatus.Equals("Activo"))
            {
                statusComboBox.SelectedIndex = statusComboBox.FindStringExact("Activo");
            }
            else
            {
                statusComboBox.SelectedIndex = statusComboBox.FindStringExact("Inactivo");
            }
            idNumVerPET.Text = Convert.ToString(person.personId);
            nameVerP.Text = person.personName;
            addressVerP.Text = person.address;
            postcodeVerP.Text = person.postalCode;
            localityVerP.Text = person.locality;
            telephoneVerP.Text = person.telephone;
            emailVerP.Text = person.email;
            telmVerP.Text = person.mobile_number;
            dateOfBirthVerP.Text = Convert.ToString(person.dateOfBirth).Replace("00:00:00", "");
            nifVerP.Text = Convert.ToString(person.nif);
            biVerP.Text = Convert.ToString(person.bi);
            emissionBiVerP.Text = Convert.ToString(person.emissionBI).Replace("00:00:00", "");
            archiveIdVerP.Text = person.archiveIdBI;
            emerContactVerP.Text = person.emergencyContact;
            observationsVerP.Text = person.observationsPerson;
        }


        private void EditarPessoaBut_Click(object sender, EventArgs e)
        {
            saveCancelButtonDisabling(false);
            if (getUserType() == 1)
            {
                pessoaPannelVerP.Enabled = true;
                estudantePannelVerP.Enabled = true;
                observacoesPannelVerP.Enabled = true;
                idNumVerPET.Enabled = false;
            }
            else if (getUserType() == 2)
            {
                pessoaPannelVerP.Enabled = true;
                observacoesPannelVerP.Enabled = true;
                idNumVerPET.Enabled = false;
            }

        }

        private void saveEditBut_Click(object sender, EventArgs e)
        {
            if (MessageBox.Show("Deseja salvar esta edição?", "Salvar edição", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
            {
                person.address = addressVerP.Text;
                person.archiveIdBI = archiveIdVerP.Text;
                person.postalCode = postcodeVerP.Text;
                person.locality = localityVerP.Text;
                person.telephone = telephoneVerP.Text;
                person.emergencyContact = emerContactVerP.Text;
                person.observationsPerson = observationsVerP.Text;
                DateTime x;
                if (DateTime.TryParse(dateOfBirthVerP.Text, out x))
                {
                    person.dateOfBirth = x;
                }
                else
                {
                    errorFields("Data de nascimento inválida.");
                    return;
                }
                if (DateTime.TryParse(emissionBiVerP.Text, out x))
                {
                    person.emissionBI = x;
                }
                else
                {
                    errorFields("Data de emissão de BI inválida.");
                    return;
                }

                if (statusComboBox.SelectedItem.Equals("Activo"))
                {
                    person.personStatus = "Activo";
                }
                else
                {
                    person.personStatus = "Inactivo";
                }


                if ((!string.IsNullOrEmpty(nameVerP.Text)) || (!string.IsNullOrEmpty(emailVerP.Text)) || (!string.IsNullOrEmpty(telmVerP.Text)))
                {
                    person.personName = nameVerP.Text;
                    person.email = emailVerP.Text;
                    person.mobile_number = telmVerP.Text;
                }
                else
                {
                    errorFields("Campos obrigatórios por preencher.");
                }
                Int64 num;
                if (!string.IsNullOrEmpty(nifVerP.Text))
                {
                    if (Int64.TryParse(nifVerP.Text, out num))
                    {
                        person.nif = num;
                    }
                    else
                    {
                        errorFields("Conversão de NIF inválida.");
                        return;
                    }
                }

                Int64 bi;
                if (Int64.TryParse(biVerP.Text, out bi))
                {
                    person.bi = bi;
                }
                else
                {
                    errorFields("Introduza um numero de BI válido.");
                    return;
                }
                if (person.personRole.CompareTo("Student") == 0)
                {
                    person.student.educationRespEmail = emailEEVerP.Text;
                    person.student.educationRespMobile = this.telmEEVerP.Text;
                    person.student.educationResp = this.nameEEVerP.Text;
                    Library.OperationStatus os = Database.PersonDBAdapter.getInstance().editStudent(person);
                    if (os.sucess)
                    {
                        Utils.sucessFields("Dados da pessoa editados com sucesso.", "Operação bem sucedida");

                    }
                    else
                    {
                        Utils.errorFields("Ocorreu um erro a editar a pessoa.", "Erro na operação");
                    }
                }
                else
                {
                    Library.OperationStatus os = Database.PersonDBAdapter.getInstance().editPerson(person);
                    if (os.sucess)
                    {
                        Utils.sucessFields("Dados da pessoa editados com sucesso.", "Operação bem sucedida");

                    }
                    else
                    {
                        Utils.errorFields("Ocorreu um erro a editar a pessoa.", "Erro na operação");
                    }
                }

                //DESATIVAR PAINEIS E BOTOES - ULTIMA COSISA
                pessoaPannelVerP.Enabled = false;
                estudantePannelVerP.Enabled = false;
                observacoesPannelVerP.Enabled = false;
                saveCancelButtonDisabling(true);
            }
        }

        private void cancelEditBut_Click(object sender, EventArgs e)
        {
            pessoaPannelVerP.Enabled = false;
            estudantePannelVerP.Enabled = false;
            observacoesPannelVerP.Enabled = false;
            saveCancelButtonDisabling(true);
        }

        private void saveCancelButtonDisabling(Boolean thisCase)
        {
            EditarPessoaBut.Enabled = thisCase;
            gerirPagBut.Enabled = thisCase;
            //verDiscipBut.Enabled = thisCase;
            deletePessoaBut.Enabled = thisCase;

            if (person.personRole.CompareTo("Teacher") == 0)
            {
                gerirPagBut.Enabled = false;
            }
            saveEditBut.Enabled = !thisCase;
            cancelEditBut.Enabled = !thisCase;

            riskLabel1.Visible = !thisCase;
            riskLabel2.Visible = !thisCase;
            riskLabel3.Visible = !thisCase;
            riskLabel4.Visible = !thisCase;
            riskLabelFather.Visible = !thisCase;
            infoLabel1.Visible = !thisCase;
            infoLabel2.Visible = !thisCase;
            infoLabel3.Visible = !thisCase;
        }

        private void gerirPagBut_Click(object sender, EventArgs e)
        {
            pcGerirPagamentos gestorPagamento = new pcGerirPagamentos(person);
        
            gestorPagamento.Text = string.Format("Gerir Pagamentos de {0} - Palco Central [Software de Gestão]", person.personName);

            gestorPagamento.ShowDialog();
        }

        private void deletePessoaBut_Click(object sender, EventArgs e)
        {

            if (MessageBox.Show("Deseja mesmo remover esta pessoa da base de dados?", "Remover pessoa", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
            {
                Library.OperationStatus os = Database.PersonDBAdapter.getInstance().removePerson(this.person);
                if (os.sucess)
                {
                    Utils.sucessFields("Pessoa removida com sucesso.","Operação bem sucedida");
                    this.Close();
                }
                else
                {
                    Utils.errorFields("Ocorreu um erro a remover a pessoa.","Erro na operação");
                }
            }            
        }

        public void errorFields(string msg)
        {
            MessageBox.Show(string.Format("{0}", msg), "Erro nos dados introduzidos",
                       MessageBoxButtons.OK, MessageBoxIcon.Error);
        }

        private void verDiscipBut_Click(object sender, EventArgs e)
        {
            pcPessoaVerDisc pvd = new pcPessoaVerDisc(this.person);
            pvd.ShowDialog();
        }

        private void closeLabel_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
        {
            this.Close();
        }


        // TAB 2

        private void verDisc_Click(object sender, EventArgs e)
        {
            if (listaDisc.SelectedIndex > -1)
            {
                pcVerDisc vd = new pcVerDisc((Database.course)listaDisc.SelectedItem);
                vd.FormClosed += new FormClosedEventHandler(refreshListing);
                vd.ShowDialog();
            }
        }

        private void addDisc_Click(object sender, EventArgs e)
        {
            pcSelectDisc psc = new pcSelectDisc(this.person);

            psc.FormClosed += new FormClosedEventHandler(cselectDisc_FormClosed);
            psc.ShowDialog();
        }
        void cselectDisc_FormClosed(object sender, FormClosedEventArgs e)
        {
            this.loadData();
        }

        private void imprimirHorario_Click(object sender, EventArgs e)
        {
            if (this.person.personRole.CompareTo("Student") == 0)
            {
                List<Library.CalendarioInput> lci = new List<Library.CalendarioInput>();
                Dictionary<String, ICollection<Database.person>> listaDisciplinasPessoas = new Dictionary<string, ICollection<Database.person>>();
                foreach (var course in (List<Database.course>)Database.CourseDBAdapter.getInstance().showPersonCourses(person).res)
                {

                    foreach (var item in (List<Database.@class>)Database.CourseDBAdapter.getInstance().showClasses(course.courseId).res)
                    {
                        Library.CalendarioInput ci = new Library.CalendarioInput();
                        ci.DayOfWeek = item.dayOfWeek;
                        ci.Start = item.startTime;
                        ci.End = item.startTime + item.duration;

                        if (string.IsNullOrEmpty(course.instrument))
                        {
                            ci.Nome = /*Library.CourseType.getValue(course.courseType).ToString() + ":" + */course.courseName;
                        }
                        else
                        {
                            ci.Nome = /*course.instrument + ":" +*/ course.courseName;
                        }

                        lci.Add(ci);
                    }
                    if (string.IsNullOrEmpty(course.instrument))
                    {

                        listaDisciplinasPessoas.Add(/*Library.CourseType.getValue(course.courseType).ToString() + ":" +*/ course.courseName, course.person);
                    }
                    else
                    {

                        listaDisciplinasPessoas.Add(/*course.instrument + ": " +*/ course.courseName, course.person);
                    }
                }
                pcVerCalend pvc = new pcVerCalend("Horário de " + person.personName, "Horário de " + person.personName + " " + person.personRole + " " + person.personId, lci);
                pvc.listaProfs = listaDisciplinasPessoas;
                pvc.populateCalend();
                pvc.Show();
            }
            else
            {
                List<Library.CalendarioInput> lci = new List<Library.CalendarioInput>();
                Dictionary<String, ICollection<Database.student>> listaDisciplinasPessoas = new Dictionary<string, ICollection<Database.student>>();
                foreach (var course in (List<Database.course>)Database.CourseDBAdapter.getInstance().showPersonCourses(person).res)
                {

                    foreach (var item in (List<Database.@class>)Database.CourseDBAdapter.getInstance().showClasses(course.courseId).res)
                    {
                        Library.CalendarioInput ci = new Library.CalendarioInput();
                        ci.DayOfWeek = item.dayOfWeek;
                        ci.Start = item.startTime;
                        ci.End = item.startTime + item.duration;
                        if (string.IsNullOrEmpty(course.instrument))
                        {
                            ci.Nome = /*Library.CourseType.getValue(course.courseType).ToString() + ":" +*/ course.courseName;
                        }
                        else
                        {
                            ci.Nome = /*course.instrument + ":" +*/ course.courseName;
                        }
                        lci.Add(ci);
                    }

                    if (string.IsNullOrEmpty(course.instrument))
                    {


                        listaDisciplinasPessoas.Add(/*Library.CourseType.getValue(course.courseType).ToString() + ":" +*/ course.courseName, course.student);
                    }
                    else
                    {

                        listaDisciplinasPessoas.Add(/*course.instrument + ":" +*/ course.courseName, course.student);
                    }
                }
                pcVerCalend pvc = new pcVerCalend("Horário de " + person.personName, "Horário de " + person.personName + " " + person.personRole + " " + person.personId, lci);
                pvc.listaStudents = listaDisciplinasPessoas;
                pvc.populateCalend();
                pvc.Show();
            }
        }

        public Database.person selectedPerson // retrieving a value from
        {
            get;
            set;
        }

        private void delDisc_Click(object sender, EventArgs e)
        {
            if (listaDisc.SelectedIndex > -1)
            {
                if (MessageBox.Show("Deseja mesmo desassociar esta disciplina desta pessoa?\n", "Desassociar disciplina de pessoa", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
                {
                    Library.OperationStatus os = Database.CourseDBAdapter.getInstance().removePersonFromCourse(person, ((Database.course)listaDisc.SelectedItem), Library.PersonRole.Admin);
                    if (os.sucess)
                    {
                        loadData();
                        Library.Utils.sucessFields("Disciplina desassociada com sucesso", "Gerir disciplinas de pessoa");
                    }
                    else
                    {
                        Library.Utils.errorFields("Erro a desassociar disciplina de pessoa.", "Erro a gerir disciplinas de pessoa");
                    }
                }
            }
        }

        private void refreshListing(object sender, EventArgs e)
        {
            loadData();
        }

        private void loadData()
        {
            Library.OperationStatus os = Database.CourseDBAdapter.getInstance().showPersonCourses(person);
            if (os.sucess)
            {
                List<Database.course> res = (List<Database.course>)os.res;

                listaDisc.DataSource = res;
                listaDisc.Update();
                if (res != null && res.Count > 0)
                {
                    //personDB.DataSource = res;

                }
                else
                {
                    //Library.Utils.atentionFields("Esta disciplina ainda não tem pessoas associadas.", "Atenção");
                }

                if (listaDisc.SelectedIndex > -1)
                {
                    verDisc.Enabled = true;
                    imprimirHorario.Enabled = true;
                    delDisc.Enabled = true;
                }
                else
                {
                    verDisc.Enabled = false;
                    imprimirHorario.Enabled = false;
                    delDisc.Enabled = false;
                }
            }
        }

        private void listaDisc_MouseDoubleClick(object sender, EventArgs e) {
            verDisc.PerformClick();
        }
    }
}

